from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.usuario import metadata, Usuario
from models.database import db_session
import sys
#import bz2
import hashlib

from models.usuarioManager import UsuarioManager

usuarioMgr = UsuarioManager()

"""
Clase que contiene los metodos relacionados con la gestion de usuarios del sistema
"""

def abmUsuario():
    """ Metodo encargado de la gestion de usuarios del sistema """
    filtro=""
    if request.method == "POST":
        filtro = request.form["filtro"]
        return paginarUsuario(1, filtro)
    if request.method == "GET":
        if request.args.getlist("filtro"):
            filtro = request.args.getlist("filtro")[0]
        pagina=1
        if request.args.getlist("pagina"):
            pagina=request.args.getlist("pagina")[0]
        return paginarUsuario(pagina, filtro)
        
def crearUsuario():
    """ Metodo encargado de guardar un usuario """
    
    if request.method == "POST":
        nombre = request.form["nombre"]
        apellido = request.form["apellido"]
        cedula = request.form["cedula"]
        username = request.form["usuario"]
        password = request.form["contrasenha"]
        password = hashlib.sha1( password ).hexdigest()
        #password = bz2.compress(password)
        correo = request.form["correo"]
        usuario = Usuario(nombre, apellido, cedula, username, password, correo)
        usuarioMgr.guardarUsuario(usuario)
        return redirect(url_for("abmUsuario", filtro = request.form["filtro"]))
    return render_template("crearUsuario.html", usuario = request.form, filtro = request.args.getlist("filtro")[0])

def modificarUsuario():
    """ Metodo encargado de modificar un usuario s"""
    
    if request.method == "GET":
        idusuario = request.args.getlist("idusuario")[0]
        user = usuarioMgr.getUsuario(idusuario)
        return render_template("modificarUsuario.html", usuario = user, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idusuario = request.form["idusuario"]
        user = usuarioMgr.getUsuario(idusuario)
        user.nombre = request.form["nombre"]
        user.apellido = request.form["apellido"]
        user.cedula = request.form["cedula"]
        user.usuario = request.form["usuario"]
        contrasenha = request.form["contrasenha"]
        user.contrasenha = hashlib.sha1( contrasenha ).hexdigest()
    #password = bz2.compress(password)
        user.correo = request.form["correo"]
        usuarioMgr.guardarUsuario(user) 
        mensajes = get_flashed_messages(with_categories= True)
        categoria, mensaje = mensajes[0]
        if categoria == "error":
            flash(mensaje, categoria)
            mensajes = get_flashed_messages(with_categories= True)
        else:
            flash("Modificado exitosamente");
            mensajes = get_flashed_messages(with_categories= True)
        return redirect(url_for("abmUsuario", filtro = request.form["filtro"]))

def eliminarUsuario():
    """ Metodo encargado de eliminar un usuario """
    
    if request.method == "POST":
        idusuario = request.form["idusuario"]
        usuarioMgr.eliminarUsuario(idusuario)    
        flash("Usuario eliminado exitosamente")
        return redirect(url_for("abmUsuario", filtro= request.form["filtro"]))
    if request.method == "GET":
        idusuario = request.args.getlist("idusuario")[0]
        usuario = usuarioMgr.getUsuario(idusuario)
        return render_template("eliminarUsuario.html", filtro= request.args.getlist("filtro")[0], usuario=usuario)

def consultarUsuario():
    """ Metodo encargado de consultar los datos de un usuario """
    
    if request.method == "GET":
        idusuario = request.args.getlist("idusuario")[0]
        usuario = usuarioMgr.getUsuario(idusuario)
        return render_template("consultarUsuario.html", usuario = usuario, filtro = request.args.getlist("filtro")[0])
    return redirect(url_for("abmUsuario", filtro = request.form["filtro"]))

def paginarUsuario(pagina, filtro):
    """ Metodo encargado de la busqueda de usuarios a partir de un filtro """
    porPagina= 5
    pagina = int(pagina)
    total = usuarioMgr.getUsuariosPaginado(user=filtro, desde=None, hasta=None)
   
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    usuarios = usuarioMgr.getUsuariosPaginado(filtro, desde, hasta)
    return render_template("abmUsuario.html", lista = usuarios,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina)
      
 
